﻿using CommonUtil.Model;
using System;
using System.Configuration;
using System.Linq;
using System.Xml;

namespace CommonUtil
{
    /// <summary>
    /// 配置管理类.
    /// </summary>
    public static class ConfigManager
    {
        /// <summary>
        /// 获得AppConfig的设置信息
        /// </summary>
        /// <returns></returns>
        public static AppConfigInfo getConfigInfo()
        {
            AppConfigInfo configInfo = new AppConfigInfo();
            var configKeys = ConfigurationManager.AppSettings.AllKeys;

            // EmguCV特征检测分类器文件路径
            configInfo.FaceTrainedFileName = GetConfig("faceTrainedFileName");

            // EmguCV人脸识别类型(0:基于PCA变换的人脸识别 1:基于Fisher变换的人脸识别 2:基于局部二值模式的人脸识别)
            configInfo.FaceRecognizerType = GetConfig("faceRecognizerType", "0");

            //人脸API KEY
            configInfo.FaceApiKey = GetConfig("faceApiKey");

            // 情感API KEY
            configInfo.EmotionApiKey = GetConfig("emotionApiKey");

            // 人脸组名称
            configInfo.FaceGroupName = GetConfig("faceGroupName");

            // 是否开启语言播报（0:不开启,1:开启）
            configInfo.SpeechEnabled = GetConfig("speechEnabled", "0") == "1";

            // 自动识别间隔时间（秒）
            configInfo.IdentifyTime = GetConfig("identifyTime");

            // 是否开启人脸跟踪（0:不开启,1:开启）
            configInfo.Facetracking = GetConfig("facetracking") == "1";

            return configInfo;
        }

        public static void SetConfigInfo(AppConfigInfo configInfo) {

            // EmguCV特征检测分类器文件路径
            SetConfig("faceTrainedFileName", configInfo.FaceTrainedFileName);

            // EmguCV人脸识别类型(0:基于PCA变换的人脸识别 1:基于Fisher变换的人脸识别 2:基于局部二值模式的人脸识别)
            SetConfig("faceRecognizerType", configInfo.FaceRecognizerType);

            //人脸API KEY
            SetConfig("faceApiKey", configInfo.FaceApiKey);

            // 情感API KEY
            SetConfig("emotionApiKey", configInfo.EmotionApiKey);

            // 人脸组名称
            SetConfig("faceGroupName", configInfo.FaceGroupName);

            // 是否开启语言播报（0:不开启,1:开启）
            SetConfig("speechEnabled", configInfo.SpeechEnabled ? "1" : "0");

            // 自动识别间隔时间（秒）
            SetConfig("identifyTime", configInfo.IdentifyTime);

            // 是否开启人脸跟踪（0:不开启,1:开启）
            SetConfig("facetracking", configInfo.Facetracking ? "1" : "0");
        }


        /// <summary>
        /// 获取配置,如果配置项不存在则返回默认值，并将默认值写入配置文件.
        /// </summary>
        /// <param name="key">配置名.</param>
        /// <param name="defaultValue">默认配置.</param>
        /// <returns>System.String.</returns>
        /// <exception cref="System.ArgumentNullException">配置名不能为空</exception>
        public static string GetConfig(string key, string defaultValue = "")
        {
            if (string.IsNullOrEmpty(key)) throw new ArgumentNullException("key");
            bool isExistConfig = ConfigurationManager.AppSettings.AllKeys.Contains(key);
            if (isExistConfig)
                return ConfigurationManager.AppSettings[key];
            else if (!string.IsNullOrEmpty(defaultValue))
                SetConfig(key, defaultValue);

            return defaultValue;
        }

        /// <summary>
        /// 写入配置.
        /// </summary>
        /// <param name="key">配置名.</param>
        /// <param name="value">配置.</param>
        /// <exception cref="System.ArgumentNullException">配置名不能为空</exception>
        public static void SetConfig(string key, string value)
        {
            // 利用Configuration  
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            if (string.IsNullOrEmpty(key)) throw new ArgumentNullException("key");
            if (config.AppSettings.Settings.AllKeys.Contains(key))//已存在配置 直接写值 不存在则创建配置项
                config.AppSettings.Settings[key].Value = value;
            else
                config.AppSettings.Settings.Add(key, value);
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }

    }
}
